import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse, CreateAxiosDefaults } from 'axios'
import router from '@/router'
// 约束返回的类型
export interface IResult<T> {
    code?: 0 | 1
    data: T
    msg: string,
    total?: number,
    id?: number
}
// 创建一个请求类
class request {
    // 创建实例
    serve: AxiosInstance
    // 创建默认的配置
    baseConfig: CreateAxiosDefaults = { baseURL: import.meta.env.VITE_API_URL }
    // config用户传进去的配置
    constructor(config: CreateAxiosDefaults) {
        // 重写axios实例
        this.serve = axios.create({ ...this.baseConfig, ...config })
        // 拦截器
        this.serve.interceptors.request.use(config => {
            let token = localStorage.getItem('token')
            // 携带token
            if (token) config.headers.authorization = token
            return config
        })

        // 响应拦截器
        this.serve.interceptors.response.use(res => {
            return res
            // 发生错误的回调
        }, err => {
            // 判断状态码
            if (err.response?.status === 401) {
                router.push('/login')
            }

        })
    }


    // 重写get方法，用户传入要约束的类型
    public get<T>(url: string, config?: AxiosRequestConfig): Promise<AxiosResponse<IResult<T>, any>> {
        return this.serve.get(url, config)
    }

    // 重写post方法，用户传入要约束的类型
    public post<T>(url: string, data: object = {}): Promise<AxiosResponse<IResult<T>, any>> {
        return this.serve.post(url, data)
    }
}

export const mockAxios = new request({ baseURL: '/' })
export default new request({})